package vader.tableStore;

import com.alibaba.fastjson.JSONObject;
import com.fancy.cc.common.api.CommonPage;

import java.util.List;
import java.util.Map;

/**
 * @author: yongxin@mail.thefancyapp.com
 * @program: fancy_flip
 * @description: tableStoreService
 * @create: 2020-12-08 17:54
 **/
public interface TablestoreService {
    /**
     * 创建表
     *
     * @param clazz
     * @return
     */
    Boolean createTable(Class clazz);

    /**
     * 删除表
     *
     * @param clazz
     * @return
     */
    Boolean deleteTable(Class clazz);

    /**
     * 查询数据
     *
     * @param obj
     * @param <T>
     * @return
     */
    <T> T getData(Object obj);

    /**
     * 删除数据
     *
     * @param obj
     * @return
     */
    boolean deleteData(Object obj);

    /**
     * 更新数据
     *
     * @param obj
     * @return
     */
    boolean updateData(Object obj);

    /**
     * 新增数据
     *
     * @param obj
     * @return
     */
    boolean putData(Object obj);

    /**
     * 批量新增数据
     *
     * @param objectList
     * @return
     */
    <T> void batchPutData(List<T> objectList);

    /**
     * 批量获取数据
     *
     * @param objectList
     * @return
     */
    <T> List<T> batchGetData(List<T> objectList);

    /**
     * 范围读取数据
     *
     * @param begin
     * @param end
     * @param <T>
     * @return
     */
    <T> List<T> getRangeData(T begin, T end);

    /**
     * 根据多级索引查询列表
     * 默认只返回10条
     *
     * @param obj
     * @param indexFieldName 如  author_id #索引需要匹配的字段
     * @param query
     * @param <T>
     * @return
     */
    <T> List<T> searchData(Object obj, String indexFieldName, String query);

    /**
     * 查询前几条数据 根据时间范围查询
     *
     * @param obj
     * @param maxTime
     * @param minTime
     * @param query
     * @param queryMap
     * @param <T>
     * @return
     */
    <T> List<T> searchDataRange(Object obj, String minTime, String maxTime, String query, Map<String, Object> queryMap, Integer limitNum, String orderByParams, String orderByType);


    /**
     * 根据多级索引查询列表,多个索引值的情况
     *
     * @param obj
     * @param indexFields
     * @param isFullRow
     * @param <T>
     * @return
     */
    <T> List<T> searchMultiIndexData(Object obj, Map<String, String> indexFields, Boolean isFullRow);

    /**
     * 翻页获取数据
     *
     * @param obj
     * @param pageNum
     * @param pageSize
     * @param <T>
     * @return
     */
    <T> CommonPage<T> getDataByPage(Object obj, Integer pageNum, Integer pageSize);

    /**
     * 条件查询分页,文章详情专用
     *
     * @param obj
     * @param pageNum
     * @param pageSize
     * @param matchQuery 匹配条件
     * @param showParams 返回指定列
     * @param <T>
     * @return
     */
    <T> CommonPage<T> getDataMatchQueryByPage(Object obj, Integer pageNum, Integer pageSize, Map<String, Object> matchQuery, List<String> showParams, String indexName);


    /**
     * 根据sql查询tablestore
     * @param sql sql语句
     * @return
     */
    List<Map<String,Object>> listMapDataBySql(String sql);

    /**
     * 根据sql查询tablestore
     * @param sql sql语句
     * @return
     */
    Map<String,Object> mapDataBySql(String sql);

    /**
     * 根据sql查询tablestore
     * @param sql sql语句
     * @return
     */
    Object getDataBySql(String sql);

    /**
     * 根据sql查询tablestore
     * @param sql sql语句
     * @return
     */
    List<String> listDataBySql(String sql);

    /**
     * 根据sql查询tablestore
     * @param sql sql语句
     * @return
     */
    List<JSONObject> listJsonDataBySql(String sql);
}
